


////////////////////////////////////////////////
///请求
type Request struct {
	httpReq *http.Request  	//http请求的指针值
	depth uint32    		//请求的深度
}

//创建新的请求
func NewRequest(httpReq *http.Request, depth uint32) *Request{
	return &Request{httpReq : httpReq, depth : depth}
}

//获取http请求
func (req *Request) HttpReq() *httpRequest{
	return req.httpReq
}

//获取深度值
func (req *Request) Depth() uint32{
	return req.depth
}



////////////////////////////////////////////////
///响应
type Response struct{
	httpResp *http.Response
	depth uint32
}

// 创建新的响应
func NewResponse(httpResp *http.Response, depth uint32) *Response{
	return &Response{httpResp : httpResp, depth : depth}
}

// 获取http响应
func (resp *Response) HttpResp() *http.Response{
	return resp.httpResp
}

//获取深度值
func (resp *Response) Depth() uint32{
	return resp.depth
}



////////////////////////////////////////////////
///条目
type Item map[string]interface{}

//数据的接口
type Data interface{
	Valid() bool  //判断数据是否有效
}

//判断数据是否有效
func (req *Request) Valid() bool{
	return req.httpReq != nil && req.httpReq.URL != nil
}

//判断数据是否有效
func (resp *Response) Valid() bool{
	return resp.httpResp != nil && resp.httpResp.Body != nil
}

//判断数据是否有效
func (item Item) Valid() bool{
	return item != nil
}




////////////////////////////////////////////////
//作为error接口类型的实现类型而存在，主要作用是封装爬虫爬取过程中出现的错误
// 并以统一的方式生成字符串形式的描述
//只要某个类型的方法集合中包含了下面这个方法就等于实现了error接口类型
func Error() string

//爬虫错误的接口
type CrawlerError interface{
	Type() ErrorType  	//获得错误类型
	Error() string		// 获得错误提示信息
}

//实现该接口类型  爬虫错误的实现
type myCrawlerError struct{
	errType 	ErrorType 	//错误类型
	errMsg 		string		//错误提示信息
	fullErrMsg 	string		//完整的错误提示信息
}

//错误类型的常量
const {
	DOWNLOADER_ERROR 	ErrorType = "Downloader error"
	ANALYZER_ERROR		ErrorType = "Analyzer Error"
	ITEM_PROCESSOR_ERROR ErrorType = "Item Processor Error"
}

//创建一个新的爬虫错误
//以New为前缀的函数的作用是创建和初始化一个CrawlerError类型的值
func NewCrawlerError(errType ErrorType, errMsg string) CrawlerError{
	return &myCrawlerError{errType : errType, errMsg : errMsg}
}


// 获得错误类型
func (ce *myCrawlerError) Type() ErrorType{
	return ce.errType
}

// 获得错误提示信息
func (ce *myCrawlerError) Error() string{
	if ce.fullErrMsg == "" {
		ce.genFullErrMsg()
	}
	return ce.fullErrMsg
}

// 生成错误提示信息 并给相应的字段赋值
func (ce *myCrawlerError) genFullErrMsg(){
	var buffer bytes.Buffer
	buffer.WriteString("Crawler Error:")
	if ce.errType != ""{
		buffer.WriteString(string(ce.errType))
		buffer.WriteString(": ")
	}
	buffer.WriteString(ce.errMsg)
	ce.fullErrMsg = fmt.Sprintf("%s\n", buffer.String())
	return
}

